package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

type jieGouTi struct {
	ID      int
	Title   string
	Content string
}

type diyJSON struct {
	// 返回的结构内容key安装后面指定的json字段的key
	ID      int    `json:"id"`
	Title   string `json:"title"`
	Content string `json:"content"`
}

func demo2(c *gin.Context) {

	a := &jieGouTi{
		ID:      1,
		Title:   "结构体标题",
		Content: "结构体内容",
	}
	c.JSON(http.StatusOK, a) // 返回结构体：{"ID":1,"Title":"标题","Content":"内容"}
}

func demo3(c *gin.Context) {

	a := &diyJSON{
		ID:      1,
		Title:   "json结构体标题",
		Content: "json结构体内容",
	}
	c.JSON(http.StatusOK, a) // 返回结构体：{"id":1,"title":"标题","content":"内容"}
}

func demo4(c *gin.Context) {

	a := &diyJSON{
		ID:      1,
		Title:   "JSONP结构体标题",
		Content: "JSONP结构体内容",
	}
	c.JSONP(http.StatusOK, a)
	// JSONP 返回的内容，需要前端传入一个callback参数，这个参数就是返回的内容的函数名，可以解决跨域请求的问题
	// 请求测试：http://localhost:9090/demo4?callback=xxx
	// 返回结构体：callback参数的值会加在返回值前面这样返回	xxx({"id":1,"title":"JSONP结构体标题","content":"JSONP结构体内容"});
}

func demo5(c *gin.Context) {

	//a := &diyJSON{
	//	ID:      1,
	//	Title:   "XML结构体标题",
	//	Content: "XML结构体内容",
	//}
	//c.XML(http.StatusOK, a)
	// 返回结构体：	可以看到返回的XML结构体内容，虽然使用的json结构体，但是标签的名还是字段为准，不是以json字段的小写字母开头
	//	<diyJSON>
	//		<ID>1</ID>
	//		<Title>XML结构体标题</Title>
	//		<Content>XML结构体内容</Content>
	//	</diyJSON>

	c.XML(http.StatusOK, gin.H{
		"success": true,
		"msg":     "返回的xml的msg",
	})
	// 返回的xml
	// 	<map>
	// 		<success>true</success>
	// 		<msg>返回的xml的msg</msg>
	// 	</map>
}

func demo6(c *gin.Context) {
	// 引入gin框架以后要使用 r.LoadHTMLGlob("demo_02_gin_demo/templates/*") 加载模板
	c.HTML(http.StatusOK, "test.html", gin.H{
		"aaa": "模拟后台返回数据",
	})
	// 返回的yaml
	// success: true
	// msg: 返回的yaml的msg
}

func main() {
	r := gin.Default()
	// 如果返回使用 c.HTML()，就必须要执行这一行
	r.LoadHTMLGlob("demo_02_gin_demo/templates/*") // 路径是相对于当前项目的相对路径的目录

	r.GET("/demo2", demo2)
	r.GET("/demo3", demo3)
	r.GET("/demo4", demo4)
	r.GET("/demo5", demo5)
	r.GET("/demo6", demo6)

	// 启动,默认不写的话是8080端口
	r.Run(":9090")
}
